package banco.pessoa;

import excecoes.estoque.DinheiroNegativoException;
import excecoes.pessoa.LocalizacaoInvalidaException;
import excecoes.pessoa.NomeFantasiaNuloException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.JOptionPane;
import banco.Conexao;
import excecoes.pessoa.CpfCnpjExistenteException;
import excecoes.pessoa.CpfCnpjInvalidoException;
import excecoes.pessoa.NomeInvalidoException;
import java.sql.Statement;
import smartMarket.pessoa.Fornecedor;
import smartMarket.pessoa.Pessoa;

public class BancoFornecedor extends Conexao {

    //Construtor
    public BancoFornecedor() {
        super();
    }

    //Métodos
    public void alterar(Fornecedor fornecedor) throws SQLException {
        PreparedStatement st = conexao.prepareStatement("update fornecedor set razaosocial = ?, cnpj=?,uf=?,fone=?,fantasia=?,endereco=?,bairro=?,cidade=?,fone2=?,email=?, limite = ? "
                + "where codigo = ?");
        st.setString(1, fornecedor.getNome());
        st.setString(2, fornecedor.getCPF_CNPJ());
        st.setInt(3, fornecedor.getEstado());
        st.setString(4, fornecedor.getTelefone());
        st.setString(5, fornecedor.getNomeFantasia());
        st.setString(6, fornecedor.getRua() + ", " + fornecedor.getNumero());
        st.setString(7, fornecedor.getBairro());
        st.setString(8, fornecedor.getCidade());
        st.setString(9, fornecedor.getCelular());
        st.setString(10, fornecedor.getEmail());
        st.setFloat(11, fornecedor.getLimiteDeCredito());
        st.setInt(12, fornecedor.getCodigo());
        st.execute();
        st.close();
        JOptionPane.showMessageDialog(null, "Fornecedor alterado com sucesso");
    }

    public void novo(Fornecedor fornecedor) throws SQLException {
        PreparedStatement st = conexao.prepareStatement("insert into fornecedor(razaosocial, cnpj,uf,fone,fantasia,endereco,bairro,cidade,fone2,email,limite) "
                + "values (?,?,?,?,?,?,?,?,?,?,?)");
        st.setString(1, fornecedor.getNome());
        st.setString(2, fornecedor.getCPF_CNPJ());
        st.setInt(3, fornecedor.getEstado());
        st.setString(4, fornecedor.getTelefone());
        st.setString(5, fornecedor.getNomeFantasia());
        st.setString(6, fornecedor.getRua() + ", " + fornecedor.getNumero());
        st.setString(7, fornecedor.getBairro());
        st.setString(8, fornecedor.getCidade());
        st.setString(9, fornecedor.getCelular());
        st.setString(10, fornecedor.getEmail());
        st.setFloat(11, fornecedor.getLimiteDeCredito());
        st.execute();
        st.close();
        JOptionPane.showMessageDialog(null, "Fornecedor cadastrado com sucesso.");
    }

    public Fornecedor buscar(int codigo) throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, CpfCnpjInvalidoException, DinheiroNegativoException, CpfCnpjExistenteException, LocalizacaoInvalidaException, NomeFantasiaNuloException {
        PreparedStatement st = conexao.prepareStatement("select * from fornecedor where codigo = ?");
        st.setInt(1, codigo);
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return null;
        }
        return retornar(rs);
    }

    public Fornecedor buscar(String cnpj) throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, DinheiroNegativoException, CpfCnpjExistenteException, LocalizacaoInvalidaException, NomeFantasiaNuloException {
        PreparedStatement st = conexao.prepareStatement("select * from fornecedor where cnpj = ?");
        st.setString(1, cnpj);
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            //JOptionPane.showMessageDialog(null, "Nenhum fornecedor encontrado");
            return null;
        }
        return retornar(rs);
    }

    public void excluir(Fornecedor forne) throws SQLException {
        PreparedStatement st = conexao.prepareStatement("delete from fornecedor where codigo = ?");
        st.setInt(1, forne.getCodigo());
        st.execute();
        JOptionPane.showMessageDialog(null, "Fornecedor excluído com sucesso");
    }

    private Fornecedor retornar(ResultSet rs) throws NullPointerException, SQLException, NomeInvalidoException, CpfCnpjInvalidoException, DinheiroNegativoException, CpfCnpjExistenteException, LocalizacaoInvalidaException, NomeFantasiaNuloException {
        Fornecedor fornecedor = new Fornecedor();
        fornecedor.setCodigo(rs.getInt("codigo"));
        fornecedor.setNome(rs.getString("razaosocial"));
        fornecedor.setCPF_CNPJ(rs.getString("cnpj"));
        fornecedor.setEstado(rs.getInt("uf"));
        fornecedor.setTelefone(rs.getString("fone"));
        fornecedor.setRua(rs.getString("endereco").split(",")[0]);
        fornecedor.setNumero(rs.getString("endereco").split(",")[1]);
        fornecedor.setBairro(rs.getString("bairro"));
        fornecedor.setCidade(rs.getString("cidade"));
        fornecedor.setCelular(rs.getString("fone2"));
        fornecedor.setEmail(rs.getString("email"));
        fornecedor.setNomeFantasia(rs.getString("fantasia"));
        fornecedor.setLimiteDeCredito(rs.getFloat("limite"));
        return fornecedor;
    }

    public Integer ultimoFornecedor() throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException {
        PreparedStatement st = conexao.prepareStatement("SELECT MAX(codigo) AS maximo FROM fornecedor");

        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return 1;
        }
        return rs.getInt("maximo");
    }

    public Vector<Pessoa> listar() throws SQLException, NullPointerException, NomeInvalidoException, CpfCnpjInvalidoException, CpfCnpjInvalidoException, DinheiroNegativoException, CpfCnpjExistenteException, LocalizacaoInvalidaException, NomeFantasiaNuloException {
        Vector<Pessoa> fornecedores = new Vector<Pessoa>();
        PreparedStatement st = conexao.prepareStatement("select * from fornecedor");
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            JOptionPane.showMessageDialog(null, "Nenhum produto cadastrado");
            return null;
        } else {
            fornecedores.add(retornar(rs));
            while (rs.next()) {
                fornecedores.add(retornar(rs));
            }
        }
        return fornecedores;
    }
    
    public Vector<Fornecedor> buscarNome(String nome) {

        try {
            Vector<Fornecedor> clientes = new Vector<Fornecedor>();
            Statement st = conexao.createStatement();
            ResultSet rs = st.executeQuery("select * from fornecedor where razaosocial like '%" + nome + "%'");
            if (!rs.next()) {
                JOptionPane.showMessageDialog(null, "Nenhum produto encontrado");
                return null;
            } else {
                clientes.add(retornar(rs));
                while (rs.next()) {
                    clientes.add(retornar(rs));
                }
                return clientes;
            }
            
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar produto " + e.getMessage());
            return null;
        }
    } 
    
}
